package javacroft.dataccess;

import java.util.List;
import java.util.Map;

/**
 *
 * Classe abstraite de gestion de la couche persistance des données
 * @author Fabien RETIF
 * @version 1.0
 */
public abstract class DataAccessFactory
{

    protected String dataAccessString = "undefined";

    /**Constructeur de la classe
      * @param chaine paramètre de la chaine de connexion ou du fichier
    */
    public DataAccessFactory(String chaine)
    {
        dataAccessString = chaine;
    }

    public static DataAccessFactory createDataAccess(String choix)
    {
        if (choix.equalsIgnoreCase("db"))
        {
            return new OracleProvider();
        }
        else if (choix.equalsIgnoreCase("txt"))
        {
            return new TxtProvider();
        }
        else
            return null;
    }

    /**
     *  Procédure d'ouverture du conteneur
     *  @throws Exception en cas d'erreur
     */
    public abstract void openDataAccess () throws Exception;

    /**
     * Procédure de fermeture du conteneur
     * @throws Exception en cas d'erreur
     */
    public abstract void closeDataAccess() throws Exception;

    /**
      * Fonction qui retourne la liste des noms des départements
     * @throws Exception en cas d'erreur
      * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
    */
    public abstract List<Map> getLesDepartements() throws Exception;

     /**
    * Fonction qui retourne la liste des années contenu dans un département
    * @throws Exception en cas d'erreur
    *  @param nomDepartement : nom du département
    * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
    */
    public abstract List<Map> getLesAnnees(String nomDepartement) throws Exception;

    /**
      * Fonction qui retourne la liste des semestres contenu dans une année
     * @throws Exception en cas d'erreur
     *  @param nomAnnee nom de l'année
      * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
    */
    public abstract List<Map> getLesSemestres(String nomAnnee) throws Exception;

    /**
      * Fonction qui retourne la liste des UE contenu dans un semestre
     * @throws Exception en cas d'erreur
     *  @param codeApogee Code d'un semestre
      * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
    */
    public abstract List<Map> getLesUE(String codeApogee) throws Exception;

    /**
      * Fonction qui retourne la liste des ECUE contenu dans une UE
     * @throws Exception en cas d'erreur
      * @param nomUE Nom d'une UE
      * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
    */
    public abstract List<Map> getLesECUE(String nomUE) throws Exception;

    /**
      * Fonction qui retourne les étudiants inscrit dans une année
     * @throws Exception en cas d'erreur
      * @param nomAnnee Nom de l'année
      * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
    */
    public abstract List<Map> getLesEtudiantsAnnee(String nomAnnee) throws Exception;

    /**
     * Retourne la moyenne d'un étudiant à l'étranger
     * @param nom Nom de l'étudiant
     * @param prenom Prénom de l'étudiant
     * @param codeSemestre Code apogée du semestre
     * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
     * @throws Exception en cas d'erreur
     */
    public abstract List<Map> getLesMoyennesEtranger(String nom, String prenom,String codeSemestre) throws Exception;

     /**
     * Retourne l'année à laquelle appartient une UE
     * @param nomUE Nom de l'UE
     * @return Un dictionnaire
     * @throws Exception
     */
    public abstract Map getAnneeUE(String nomUE) throws Exception;

    /**
     * Retourne l'année à laquelle appartient une ECUE
     * @param nomECUE Nom de l'ECUE
     * @return Un dictionnaire
     * @throws Exception
     */
    public abstract Map getAnneeECUE(String nomECUE) throws Exception;

    /**
     * Retourne le semestre auquelle une UE appartient
     * @param nomUE Nom de l'UE
     * @return Un dictionnaire
     * @throws Exception
     */
    public abstract Map getLeSemestreUE(String nomUE) throws Exception;

    /**
     * Retourne le semestre aquelle une ECUE appartient
     * @param nomECUE Nom de l'ECUE
     * @return Un dictionnaire
     * @throws Exception
     */
    public abstract Map getLeSemestreECUE(String nomECUE) throws Exception;

    /**
     * Retourne le nom de l'UE correspondant à une ECUE
     * @param nomECUE Nom de l'ECUE
     * @return Un dictionnaire
     * @throws Exception
     */
    public abstract Map getUEECUE(String nomECUE) throws Exception;

    /**
     * Retourne le nom et le coeff d'une ECUE
     * @param nomECUE Nom de l'ECUE
     * @return Un dictionnaire
     * @throws Exception
     */
    public abstract Map getECUE(String nomECUE) throws Exception;

    /**
     * Retourne toutes les informations concernant un enseignant
     * @param login Login de l'utilisateur
     * @param password Mot de passe de l'utilisateur
     * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
     * @throws Exception en cas d'erreur
     */
    public abstract List<Map> getInfosEnseignant(String login, String password) throws Exception;

    /**
     * Retourne les départements dont un enseignant est responsable
     * @param nom Nom de l'enseignant
     * @param prenom Prénom de l'enseignant
     * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
     * @throws Exception En cas d'erreur
     */
    public abstract List<Map> getLesDepartementsEnseignant(String nom, String prenom) throws Exception;

    /**
     * Retourne les années dont est responsable un enseignant
     * @param nom Nom de l'enseignant
     * @param prenom Prénom de l'enseignant
     * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
     * @throws Exception
     */
    public abstract List<Map> getLesAnneesEnseignant(String nom, String prenom) throws Exception;

    /**
     * Retourne les UE dont un enseignant est responsable
     * @param nom Nom de l'enseignant
     * @param prenom Prénom de l'enseignant
     * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
     * @throws Exception
     */
    public abstract List<Map> getLesUEEnseignant(String nom, String prenom) throws Exception;

    /**
     * Retourne les matières dont un enseignant est reponsable
     * @param nom Nom de l'enseignant
     * @param prenom Prénom de l'enseignant
     * @return Une liste de dictionnaire. Les dictionnaires correspondent à des couples clé/valeurs de chaînes de caractères (nom de colonne/valeur)
     * @throws Exception
     */
    public abstract List<Map> getLesECUEEnseignant(String nom, String prenom) throws Exception;

    /**
     * Recherche si la note d'un étudiant existe déjà
     * @param nom Nom de l'étudiant
     * @param prenom Prénom de l'étudiant
     * @param nomECUE Nom de l'ECUE
     * @return 1 si la note existe, 0 sinon
     * @throws Exception
     */
    public abstract String existeNote(String nom, String prenom,String nomECUE) throws Exception;

    /**
     * Met à jour la note d'un étudiant
     * @param nom Nom de l'étudiant
     * @param prenom Prénom de l'étudiant
     * @param nomECUE Nom de l'ECUE
     * @param note Valeur de la note
     * @param estRattrapage 1 si la note correspond à un rattrapage, 0 sinon
     * @throws Exception
     */
    public abstract void updateNote(String nom, String prenom,String nomECUE,String note,String estRattrapage) throws Exception;

    /**
     * Insère la une nouvelle note pour un étudiant
     * @param nom Nom de l'étudiant
     * @param prenom Prénom de l'étudiant
     * @param nomECUE Nom de l'ECUE
     * @param note Valeur de la notee
     * @param estRattrapage 1 si la note correspond à un rattrapage, 0 sinon
     * @throws Exception
     */
    public abstract void insertNote(String nom, String prenom,String nomECUE,String note,String estRattrapage) throws Exception;

    /**
     * Supprime tous les APDJ d'un étudiant
     * @param nom Nom de l'étudiant
     * @param prenom Prénom de l'étudiant
     * @throws Exception
     */
    public abstract void deleteAllAPDJ(String nom, String prenom) throws Exception;

    /**
     * Insère une APDJ pour un étudiant
     * @param nom Nom de l'étudiant
     * @param prenom Prénom de l'étudiant
     * @param nomUE Nom de l'UE APDJ
     * @throws Exception
     */
    public abstract void insertAPDJ(String nom, String prenom,String nomUE) throws Exception;

    /**
     * Supprime tous les points jury semestre d'un étudiant
     * @param nom Nom de l'étudiant
     * @param prenom Prénom de l'étudiant
     * @throws Exception
     */
    public abstract void deleteAllPointJurySemestre(String nom, String prenom) throws Exception;

    /**
     * Supprime toutes les points jury année d'un étudiant
     * @param nom Nom de l'étudiant
     * @param prenom Prénom de l'étudiant
     * @throws Exception
     */
    public abstract void deleteAllPointJuryAnnee(String nom, String prenom) throws Exception;

    /**
     * Insère les points jury année d'un étudiant
     * @param nom Nom de l'étudiant
     * @param prenom Prénom de l'étudiant
     * @param nbPoint Nombre de points jury à insérer
     * @throws Exception
     */
    public abstract void insertPointJuryAnnee(String nom, String prenom,String nbPoint) throws Exception;

    /**
     * Insère les points jury semestre d'un étudiant
     * @param nom Nom de l'étudiant
     * @param prenom Prénom de l'étudiant
     * @param codeSemestre Code du semestre
     * @param nbPoint Nombre de points jury
     * @throws Exception
     */
    public abstract void insertPointJurySemestre(String nom, String prenom,String codeSemestre,String nbPoint) throws Exception;


}